package cn.com.guage.dtm.jubian;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * 此代码的主要功能是找出在给定范围 [N, M] 内所有两两互质的勾股数三元组，
 * 并将这些三元组输出。勾股数指的是满足 a² + b² = c² （其中 a、b、c 为正整数且 a < b < c）的三个数，
 * 而两两互质意味着这三个数中任意两个数的最大公约数为 1。
 */
public class 股股数元组 {
    // 判断两个数是否互质
    //该方法采用欧几里得算法（辗转相除法）来计算两个整数 a 和 b 的最大公约数。
    //若最大公约数为 1，则说明这两个数互质，返回 true；反之返回 false。
    private static boolean isCoprime(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a == 1;
    }

    // 判断三个数是否两两互质
    private static boolean areCoprime(int a, int b, int c) {
        Boolean isCoprime =  isCoprime(a, b) && isCoprime(a, c) && isCoprime(b, c);
        return isCoprime;
    }

    // 找出给定范围 [N, M] 内的所有勾股数元祖
    public static List<int[]> findGouGuList(int N, int M) {
        List<int[]> triplets = new ArrayList<>();
        for (int a = N; a <= M; a++) {
            for (int b = a + 1; b <= M; b++) {
                for (int c = b + 1; c <= M; c++) {
                    if (a * a + b * b == c * c) {
                        if (areCoprime(a,b,c)){
                            triplets.add(new int[]{a,b,c});
                        }
                    }
                }
            }
        }
        return triplets;
    }

    public static void main(String[] args) {
        // int N = 1;
        // int M = 20; // 示例范围，可根据需要修改
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        if(N < 1 || M<=N){
            System.out.println(0);
            sc.close();
        }else {
            List<int[]> result = findGouGuList(N, M);
            for (int[] triplet : result) {
                System.out.println( triplet[0] + " " + triplet[1] + " " + triplet[2]);
            }
        }
    }
}